package day0217.extend;

/**
 * 继承： extends 从父类继承成员.在父类的基础上拓展
 *  除了 private 以外所有的成员 都可以被继承
 *  子类/衍生类
 *  父类/基类
 *
 *  继承是一种 is a 关系
 */
public class Student extends Person {

    // name gender age
    /*
        子类 name 隐藏（hiding） 父类中的 name
        隐藏指 子类中声明和父类中同名的成员.
        子类的字段隐藏父类的字段，与字段的 类型、有无 static 无关
        子类中有和父类同名的 static 方法，这种也是隐藏
     */

    static String name;

    public int stuNo;

    public String className;

    Student(){
        // 调用父类的构造, 在子类构造函数的第一行必须是 调用父类构造。
//        super();
    }

    public void setName(String name) {
        System.out.println(this);
        this.name = name;
        /*
          super 父类对象, 可以调用父类的 成员
         */
//        super.name = name + "-super";
    }

    /**
     * 重写（Overriding, 也叫覆盖）：子类声明一个和父类中同名同参同返回的方法
     *   访问权限要相同或变大
     * 重写可以使用 @Override 检测，如果不是重写的方法使用这个注解会报错
     */
    @Override
    public void say(){
//        super.say();
        System.out.printf("我是 %s, 今年 %d  岁, 是个 %s 生。 我在 %s 班， 学号是 %d. \n",
                this.name, this.age, this.gender, this.className, this.stuNo);
    }

    static void print(){
        System.out.println("Student::print()");
    }

    public static void main(String[] args) {
        Student student = new Student();
        System.out.println(student);
        student.setName("张三");
        student.say();

        Student.print();
//        Person person = new Person();
//
//        System.out.println(person.hashCode());
    }
}
